
package ec.edu.ups.relevo.vista.controlador;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;

import ec.edu.ups.relevo.datos.dao.ContactoDAO;
import ec.edu.ups.relevo.datos.dao.ImagenDAO;
import ec.edu.ups.relevo.datos.dao.MensajeDAO;
import ec.edu.ups.relevo.datos.modeloBD.Categoria;
import ec.edu.ups.relevo.datos.modeloBD.Contacto;
import ec.edu.ups.relevo.datos.modeloBD.Imagen;
import ec.edu.ups.relevo.datos.modeloBD.Mensaje;
import ec.edu.ups.relevo.datos.modeloBD.MensajeContacto;
import ec.edu.ups.relevo.datos.modeloBD.Usuario;
import ec.edu.ups.relevo.notificaciones.jms.JMSClient;
import ec.edu.ups.relevo.utils.TecladoListenner;

@ManagedBean
@ViewScoped
public class MensajeBean 
{
	/**************************************Inyeccion de dependencias*/
	@Inject MensajeDAO mensajeDao;
	@Inject ContactoDAO contactoDAO;
	@Inject JMSClient clienteJMS;
	@Inject	ImagenDAO imagenesDao;
	@ManagedProperty(value = "#{sesionBean.getUsr()}")  private Usuario usr;
   
	/**************************************Atributos de la clase*/
	private Mensaje mensaje;
	private List destinos;//contactos seleccionados para un mensaje
	private List<Mensaje> historial_mensajes;
	private List<Imagen> listImagenes;
	private Long catImg;
	private List<Categoria> categoriasImg;
	
	private TecladoListenner listenner=new TecladoListenner() {
		@Override
		public void onTeclea(Imagen img) 
		{
			
			String teclea=img.getDescripcion().replaceAll("\n", "").trim();
			System.out.println("teclea:"+teclea);
			
			String det=mensaje.getDetalle();
			
			if(det!=null)	det=det+" "+teclea;
			else	det=teclea;
				
			mensaje.setDetalle(det);
			System.out.println("texto:"+mensaje.getDetalle());			
		}
	};
			
	/**************************************Encapsulacion de atributos de la clase*/
	public Mensaje getMensaje() {	return mensaje;	}
	public void setMensaje(Mensaje mensaje) {	this.mensaje = mensaje;	}
	public List<Mensaje> getHistorial_mensajes() { return historial_mensajes= mensajeDao.listarSinEliminados(usr); }
	public void setHistorial_mensajes(List<Mensaje> historial_mensajes) { this.historial_mensajes = historial_mensajes; }
	public List getDestinos() {	return destinos;}
	public void setDestinos(List destinos) {	this.destinos = destinos;	}
	public Usuario getUsr() {return usr;}
	public void setUsr(Usuario usr) {	this.usr = usr;	}
	public List<Imagen> getListImagenes() {	return listImagenes;	}
	public void setListImagenes(List<Imagen> listImagenes) {	this.listImagenes = listImagenes;	}
	public Long getCatImg() {	return catImg;	}
	public void setCatImg(Long catImg) //al cambiar la categoria seleccionada se recargan las imagenes
	{		
		 this.catImg = catImg;
		 listImagenes=imagenesDao.listar(catImg);
         for(Imagen img:listImagenes)
 			img.addListener(listenner);
	
	}
	public List<Categoria> getCategoriasImg() {	return categoriasImg;	}
	public void setCategoriasImg(List<Categoria> categoriasImg) {	this.categoriasImg = categoriasImg;	}
	/**************************************Metodo de inicializacion*/
	@PostConstruct
    public void init()
    {
		System.out.println("Inicializa variables");
            mensaje= new Mensaje(); 
            destinos=new ArrayList();
        categoriasImg=imagenesDao.listarCategorias();
        setCatImg(categoriasImg.get(0).getId());
    }
	
	/***************************************Action Controller (Metodos a los que accede la vista)**/
	/**
	 * Metodo que envia el mensaje
	 * @return
	 */
	public String enviar() 
    {
		System.out.println("Enviando Mensaje..");
		List<MensajeContacto> mensajeContactoList=new ArrayList<MensajeContacto>();
		for(Object c:destinos) 
		{
			Contacto destinatario=contactoDAO.read(Long.valueOf(c.toString()));
			MensajeContacto mc=new MensajeContacto();
			mc.setContacto(destinatario);
			mc.setMensaje(mensaje);
			mensajeContactoList.add(mc);
		}
		
		mensaje.setMsj_contactos(mensajeContactoList);
		mensaje.setUsuario(usr);
		mensajeDao.create(mensaje);
		clienteJMS.enviarMensaje(mensaje);
		init();//reinicia las variables
		
		mostrarMensaje("Exito al Enviar", "Exito al Enviar");
		return null;
            
    }
	
	
	public String eliminarMensaje()
	{
		System.out.println("intentando eliminar");
		
			if(mensaje!=null)
			{
				System.out.println("Eliminar"+ mensaje.toString());
				mensaje.setEliminado(true);
				mensajeDao.update(mensaje);
				mensaje=new Mensaje();
			}
			else System.out.println("Nulo");
		
		return null;	
	}	
	
	
	/**************************************Metodos privados (Metodos que la misma clase usa)**/
	private void mostrarMensaje(String titulo, String mensaje) {
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage(titulo, mensaje));

	}
	
	

}
